package io.leo.leoutils;

import android.annotation.TargetApi;
import android.graphics.Rect;
import android.os.Build;
import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo;

/**
 * @ClassName AccessibilityDevHelper
 * @Author LIL PIG
 * @Date 19-1-26 上午9:38
 * @Intro 无障碍应用开发助手
 * @God_bless_my_code_:-)
 */
public class AccessibilityDevHelper {

    /**
     * 定义了此工具返回节点信息的字符串格式时对应的格式 默认为如下 显示了所有的信息。
     * @clz 该节点的类型
     * @id 该节点定义的控件id 没有用NoId代表
     * @des 该节点的contentDescription 没有用NoDescription代表
     * @text 该节点的文字 没有用NoText代表
     * @bis 该节点在屏幕的位置 {left,top,right,bottom}
     * @bip 该节点在父控件的位置 {left,top,right,bottom}
     */
    public static String outStyle = "{clz}--{id}---{des}---{text}---{bis}---{bip}";

    /**
     * 打印所有的节点详细信息
     * @param root 根节点
     */
    public static void printAllNodeInfo(AccessibilityNodeInfo root){
        printAllNodeInfo(0,root);
    }


    /**
     * 真正打印节点信息的处理方法
     * @param level 层级 用于树型打印
     * @param currRoot
     */
    public static void printAllNodeInfo(int level,AccessibilityNodeInfo currRoot){
        String levelPrefix = StringUtils.repeat("\t\t",level);
        for (int i=0;i<currRoot.getChildCount();i++){
            AccessibilityNodeInfo currNode = currRoot.getChild(i);
            Log.i("printAllNodeInfo",levelPrefix+nodeToString(currNode));
            for (int j=0;j<currNode.getChildCount();j++){
                printAllNodeInfo(level+1,currNode.getChild(j));
            }
        }
    }

    public static String nodeToString(AccessibilityNodeInfo nodeInfo){
        return nodeToString(nodeInfo,outStyle);
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public static String nodeToString(AccessibilityNodeInfo node,String outStyle){
        if (node==null)return "NULL NODE INFO!!!!!!!!!!!!!!!!";
        CharSequence clzName = node.getClassName();
        String id = node.getViewIdResourceName();
        CharSequence des = node.getContentDescription();
        CharSequence text = node.getText();
        Rect bis = new Rect();
        Rect bip = new Rect();
        node.getBoundsInScreen(bis);
        node.getBoundsInParent(bip);

        String finalStr = outStyle.replace("{clz}",StringUtils.isEmpty(clzName)?"{NoClassName}":clzName)
                                .replace("{id}",StringUtils.isEmpty(id)?"{NoId}":id)
                                .replace("{des}",StringUtils.isEmpty(des)?"{NoDescription}":des)
                                .replace("{text}",StringUtils.isEmpty(text)?"{NoText}":text)
                                .replace("{bis}","{"+bis.left+","+bis.top+","+bis.right+","+bis.bottom+"}")
                                .replace("{bip}","{"+bip.left+","+bip.top+","+bip.right+","+bip.bottom+"}");
        return finalStr;
    }
}
